﻿
using Framework.Components;
using Framework.Utils;
using System.Collections.Generic;
using System.IO;

namespace Tproto.Maker
{
    public abstract class FileMaker 
    {
        public FileMaker()
        {
    
        }

        public void Start(string[] args)
        {
            Log.Info("path=" + Path.GetFullPath("./"));

            var systemArgs = SystemUtils.ArgUtils.SystemArgs(args);
            var paramArgs = this.GetParams(systemArgs);
            if (paramArgs == null)
            {
                Log.Error("参数整理错误!");
                return;
            }

            // 记录开始时间
            long startTimeL = TimeUtils.GetCurrentTime();

            // 执行
            int count = Execute(paramArgs);

            // 计算使用时间
            long endTimeL = TimeUtils.GetCurrentTime();
            long useTimeL = endTimeL - startTimeL;
            float useTime = useTimeL * 0.001f;

            Log.Info("total files:" + count + " time:" + useTime + "s");
        }

        /** 获取整理参数 **/
        protected abstract Dictionary<object, object> GetParams(Dictionary<string, string> inputArgs);

        /** 运行 **/
        protected abstract int Execute(Dictionary<object, object> paramArgs);



        ///** 解析完文件后, 通过解析文件生成文件. **/
        //protected bool Make(IParse parse, IFileMaker fileMaker, Map<string, Object> params)
        //{
        //    // 查看订单
        //    FileOrder[] orders = parse.orders();
        //    int count = (orders != null) ? orders.length : 0;
        //    if (count <= 0)
        //    {
        //        Log.debug("没有订单处理!" + parse);
        //        return true;
        //    }

        //    // 参数
        //    boolean result = false;
        //    string outpath = (string) params.get(CodeUtils.ARG_OUTPATH);
        //    string filename = (string) params.get(CodeUtils.ARG_FILENAME);
        //    // 遍历订单
        //    for (int i = 0; i < count; i++)
        //    {
        //        FileOrder order = orders[i];
        //        // 名称过滤
        //        string asName = (string) params.get("-asname"); // 先用asname
        //        string baseName = (!StringUtils.isEmpty(asName)) ? asName : order.getName();

        //        // 订单名
        //        if (!baseName.matches("^[a-z0-9A-Z_]*$"))
        //        {
        //            Log.error("订单名称异常: baseName=" + baseName);
        //            continue;
        //        }

        //        // 文件名
        //        string fileName = CodeUtils.getFileName(baseName, filename);
        //        fileName = CodeUtils.fristUpper(fileName);
        //        order.setFileName(fileName);
        //        order.setBaseName(baseName);

        //        // 编译代码
        //        boolean result0 = false;
        //        try
        //        {
        //            result0 = fileMaker.maker(order, params);
        //        }
        //        catch (Exception e)
        //        {
        //            Log.error("文件生成错误: " + order.getName() + " ", e);
        //            continue;
        //        }

        //        if (!result0)
        //        {
        //            Log.error("生成文件失败: " + order.getName());
        //            continue;
        //        }

        //        // 生成文件名和文件內容
        //        string str = fileMaker.toString();

        //        // 整理路径
        //        string filepath = outpath + "/" + fileName;
        //        filepath = filepath.replace("\\\\", "/");
        //        filepath = filepath.replace("//", "/");
        //        // 保存文件
        //        if (!FileUtils.saveFile(filepath, str, "UTF-8", false))
        //        {
        //            Log.error("文件保存失败: " + filepath);
        //            continue;
        //        }
        //        Log.info("文件保存成功:" + filepath);
        //        result = true;
        //    }
        //    return result;
        //}
        

        ///**
        // * 获取语言编码器
        // * 
        // * @param language
        // * @return
        // */
        //protected IFileMaker getFileMaker(IFileMaker[] makers, string type, string language)
        //{
        //    // 过滤
        //    if (type == null || language == null)
        //    {
        //        return null;
        //    }

        //    // 遍历
        //    int count = (makers != null) ? makers.length : 0;
        //    for (int i = 0; i < count; i++)
        //    {
        //        IFileMaker maker = makers[i];
        //        string language0 = maker.language();
        //        string type0 = maker.type();
        //        if (type0.equals(type) && language0.equals(language))
        //        {
        //            // 重新创建一个新的对象
        //            Class <?> clazz = maker.getClass();
        //            return (IFileMaker)ReflectUtils.createInstance(clazz);
        //        }
        //    }
        //    return null;
        //}


    }
}
